package br.com.bmb.monitorimoveis;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import br.com.bmb.monitorimoveis.entidade.Anuncio;
import br.com.bmb.monitorimoveis.entidade.InfoColeta;
import br.com.bmb.monitorimoveis.servico.IAnuncioService;
import br.com.bmb.monitorimoveis.servico.IInfoColetaService;
import br.com.bmb.monitorimoveis.servico.impl.ColetaWImoveisService;

public class App {
	public static void main(String[] args) {
		
		IAnuncioService anuncioService = (IAnuncioService) getContext()
				.getBean("anuncioService");
		
		ColetaWImoveisService servico = new ColetaWImoveisService();
		
		String urlAnuncio = "http://www.wimoveis.com.br/imovel/venda-apartamento-aguas-claras-df-3-quartos-av-sibipiruna-778176";
		
		Anuncio anuncio = null;
		try {
			anuncio = servico.coletarAnuncio(urlAnuncio);
			anuncioService.inserir(anuncio);
			System.out.println("ANUNCIO INSERIDO COM SUCESSO!");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	// http://www.wimoveis.com.br/df/guara/vaga/venda/?busca=galeria&quarto=todos&o=F&planta=1&pronto=1

	/**
	 * Coleta os anuncios que estão pendentes. Para saber quais anuncios estão
	 * pendentes, deve-se consultar a tabela InfoColeta. Os InfoColeta que
	 * tiverem a propriedade 'coletado' = false, devem ser coletados por essa
	 * rotina.
	 */
	private static void coletarPendentes() {

		ColetaWImoveisService servico = new ColetaWImoveisService();
		IAnuncioService anuncioService = (IAnuncioService) getContext()
				.getBean("anuncioService");
		IInfoColetaService servicoInfoColeta = (IInfoColetaService) getContext()
				.getBean("infoColetaService");

		List<InfoColeta> urls = servicoInfoColeta.listarPendentes();
		System.out.println("Numero de anuncios a serem coletados: "
				+ urls.size());
		Anuncio anuncio = null;
		int contador = 1;
		for (InfoColeta infoColeta : urls) {
			if (contador % 50 == 0) {
				System.out.println("Obtendo anuncio " + contador);
			}
			try {
				contador++;
				System.out.print("Obtendo -> " + infoColeta.getUrl());
				anuncio = servico.coletarAnuncio(infoColeta.getUrl());
				anuncioService.inserir(anuncio);
				infoColeta.setColetado(true);
				servicoInfoColeta.atualizar(infoColeta);

				Thread.sleep(1200);
				System.out.print("   ->  OK");
			} catch (Exception e) {
				System.out.println("   ->  FAIL!!!");
				e.printStackTrace();
			}
		}

	}

	/**
	 * Roda a coleta dos anuncios do WImoveis. 1. Obtem os URLS para pesquisa a
	 * partir do Gerador de URLs 2. Realiza as pesquisas e gera uma lista de
	 * InfoColeta com as URLs dos anuncios 3. Coleta cada anuncio retornado nas
	 * pesquisas 4. Grava os anuncios no BD.
	 * 
	 */

	// TODO arrumar essa rotina para ela desconsiderar os anuncios que não foram
	// atualizados.
	// TODO criar os registros InfoColeta para os anuncios que não foram
	// coletados.
	private static void dispararColeta() {
		ColetaWImoveisService servico = new ColetaWImoveisService();
		IAnuncioService anuncioService = (IAnuncioService) getContext()
				.getBean("anuncioService");

		List<InfoColeta> urls = servico.coletarURLsAnuncios();
		Anuncio anuncio = null;

		System.out
				.println("*************** INICIANDO A COLETA DOS ANUNCIOS ****************");
		for (InfoColeta url : urls) {
			System.out.println(url.getUrl());
			try {
				anuncio = servico.coletarAnuncio(url.getUrl());
				anuncioService.inserir(anuncio);
				url.setColetado(true);
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out
				.println("*************** FINALIZANDO A COLETA DOS ANUNCIOS ****************");

		System.out
				.println("//////////////////////////////////////////////////////////");
		System.out.println("URLS não coletados | PROBLEMA ");
		for (InfoColeta infoColetaAnuncio : urls) {

			if (!infoColetaAnuncio.isColetado()) {
				System.out.println(infoColetaAnuncio.getUrl());
			}
		}
		System.out
				.println("//////////////////////////////////////////////////////////");
	}

	public static ApplicationContext getContext() {
		return new ClassPathXmlApplicationContext("spring.xml");
	}
}
